package shared;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map.Entry;


public class Partie implements Serializable {
    //Champs STATICS
	private static final long serialVersionUID = 1L;
    public static int EN_ATTENTE = 0;
    public static int EN_COURS = 1;
    public static int FINIE = 2;
    public static int MAX_PLAYERS = 4;
    
    //Attributs
    String [] status = {"En Attente","En cour"};
    private Hashtable<Integer, Joueur> joueurs = new Hashtable<Integer, Joueur>(); //joueurs + score du joueur
    private Integer statut = 0;
    private ArrayList<Carte> jeu_de_cartes = new ArrayList<Carte>();
    private Joueur gagnant;
    
    public Partie() {
    	//on initialise e jeu
    	for(int val=7;val<15;val++){
    		for(int couleur=0;couleur<4;couleur++){
    			jeu_de_cartes.add(new Carte(val,couleur));
    		}
    	}
    }
   
    public int getNbJoueurs() { 
    	return joueurs.size(); 
    }
    
    public int getScoreJoueur(Joueur joueur) throws RemoteException { 
    	return joueur.getScrore();
    }
    
    public int getStatut() { 
    	return statut; 
    }
    //TODO afficher les actions et r�sultats dans la console des utilisateurs ?
   
    /**
     * Ajoute le joueur � la partie s'il reste des place dispo
     * @param player
     * @return false si la partie est d�j� d�marr�e
     * @throws RemoteException 
     */
    public boolean addJoueur(Joueur joueur) throws RemoteException {
        if(statut!=Partie.EN_ATTENTE)
            return false;
       
        joueurs.put(joueur.getId(),joueur);
       
        if(joueurs.size()==Partie.MAX_PLAYERS)
            statut = Partie.EN_COURS;
       
        return true;
    }
   
    public void quitterPartie(Joueur joueur) {
        //Redistribuer
    }
   
    private void melanger() {
        //Traiter jeu de carte de manière aléatoire.

    }
    
    private void distribuer() {
        //Distribuer les cartes aux joueurs
    }
    

    //Tous les joueurs montrent leur cartes.
    public Joueur jouer() {
    	
		return gagnant;
    }
   
    //Compare les cartes jou�es et les donne au(x) perdant(s) - sauf match nul
    public void comparer() {
       
        //d�termine le ou les perdants
      /*
    	int value = 0; ArrayList<Joueur> min = new ArrayList<Joueur>();
        for(Entry<Carte, Joueur> p : cartes.entrySet()) {
            Carte carte = p.getKey();
           
            if(value==0 || value>=carte.getValeur()) {          
                if(value>carte.getValeur()) { min.clear(); } //un nouveau minimum : on vide la liste des perdants
               
                value = carte.getValeur();
                min.add(p.getValue());
            }
        }
       
        //match nul
        if(min.size()==joueurs.size()) {
            return;
        }
       
        //enleve les cartes du tapis de la main des joueurs puis les distribue entre les perdants
        for(Entry<Carte, Joueur> p : cartes.entrySet()) {
            p.getValue().removeCarte(p.getKey());
        }
        distribuer(cartes, min);
        cartes.clear();
       
        if(isFini()) {
            statut = Partie.FINIE;
        }
        */
    }
   
    //Verifie si la partie est finie ou non : return vrai si un joueur a l'ensemble des cartes
    public boolean isFini() {
        return false;
    }
}
